function isObject(value) {
  const valueType = typeof value
  return value !== null && (valueType === 'object' || valueType === 'function')
}

function deepClone(originObj) {
  /* 这里的Set和Map只是浅拷贝 */
  //判断value是否是Set
  if (originObj instanceof Set) {
    return new Set([...originObj])
  }
  //判断value是否是Map
  if (originObj instanceof Map) {
    return new Map([...originObj])
  }

  //判断value如果是Symbol，创建一个新的Symbol
  if (typeof originObj === 'symbol') {
    return Symbol(originObj.description)
  }

  //判断传入的参数是否是对象
  if (!isObject(originObj)) {
    return originObj
  }

  //判断是否是函数
  if (typeof originObj === 'function') {
    return originObj
  }

  //判断传入的对象是数组还是对象
  const newObject = Array.isArray(originObj)
    ? []
    : //构造函数对象特殊处理
    new originObj.constructor()
  for (const key in originObj) {
    //循环引用
    if (originObj[key] === originObj) {
      newObject[key] = newObject
      continue
    }
    newObject[key] = deepClone(originObj[key])
  }

  //对Symbol进行特殊处理
  const sy = Object.getOwnPropertySymbols(originObj)
  for (const symbol of sy) {
    newObject[symbol] = deepClone(originObj[symbol])
  }

  return newObject
}

export default deepClone
